package org.nettyServer.server;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * TCP消息解码器
 */

@Slf4j
public class TCPBaseMessageDecoder extends ByteToMessageDecoder{

    @Override
    protected void  decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {

        //获取读取标识
        int readerIndex = in.readerIndex();

        //获取被写入数据总长度
        int writerIndex = in.writerIndex();

        //用于存放所有换行符的索引
        List<Integer> lineEnds = new ArrayList<>();

        // 查找所有换行符的位置
        for (int i = readerIndex; i < writerIndex; i++) {
            if (in.getByte(i) == 10) { // 10代表换行符'\n'
                lineEnds.add(i);
            }
        }

        if (lineEnds.isEmpty()) {
            // 没有找到换行符，不处理任何数据，等待下次读取
            return;
        }

        // 处理所有完整的消息
        int currentIndex = readerIndex;
        for (int end : lineEnds) {
            int length = end - currentIndex;
            byte[] line = new byte[length];
            in.getBytes(currentIndex, line); // 读取从currentIndex到end-1的数据
            out.add(line);
            currentIndex = end + 1; // 跳过换行符
        }
        // 移动读指针到最后一个换行符之后的位置
        in.readerIndex(currentIndex);
    }
}
